#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <fcntl.h>

#define _FILE_NAME_FORMAT_ "%s/log/mydaemon.%ld"

// 周期性写日志: 设置 闹钟信号
void TouchFile(int num) {
    char* HomeDir = getenv("HOME");
    char StrFileName[256] = {0};
    
    sprintf(StrFileName, _FILE_NAME_FORMAT_, HomeDir, time(NULL));
    printf("dir = %s\n", StrFileName);

    int fd = open(StrFileName, O_RDWR | O_CREAT, 0666);
    if(fd < 0) {
        perror("open err");
        exit(1);
    }
    close(fd);
}


int main()
{
    // 创建子进程
    pid_t pid = fork();
    // 退出父进程
    if(pid > 0) {
        exit(1);  
    }
    
    setsid();  // 由子进程调用
    
    chdir(getenv("HOME"));
    
    // 设置文件掩码
    umask(0000);
    
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    
    // 周期性的产生闹钟信号
    // 捕捉闹钟信号，自定义信号处理动作(写日志)
    
    // 设置信号触发周期
    struct itimerval myit = {{5, 0}, {3, 0}};
    setitimer(ITIMER_REAL, &myit, NULL);

    struct sigaction act;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    act.sa_handler = TouchFile;
    
    sigaction(SIGALRM, &act, NULL);

    printf("Hello world\n");
    while(1) {
        sleep(1);
    }

    return 0;
}

